package jwj8508;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {

	// 콜렉션 collection
	// 객체지향 기반 프로그램 작성시 종종 같은 종류의 객체의 묶음group이나
	// 다른 종류의 객체묶음을 함께 쓰는때가 있음
	
	// 앞서 배운 배열은 같은 종류의 객체 묶음이지만 유연성이 부족하고, 크기 조정도 안되고 
	// 다른 종류의 객체도 가질 수 없음
	
	// 다행히 자바에는 이러한 종류의 객체를 쉽게 다룰 수 있는 인터페이스와 클래스를 제공
	// 그것은 바로 Collection 프레임워크임
	
	// collection은 다른 종류로 구성된 객체들의 묶음을 의미
	// 또 다른 말로 용기container라고도 하는데, 각 요소를 저장, 검색, 조작하는 메서드를 제공
	
	// Collection <- Set, List, Queue
	// List <- ArrayList, Vector
	// Map <- AbstractMap, SortedMap
	// AbstractMap <- HashMap
	// Iterator, Comparator
	
	// 이들 대부분은 java.util 패키지에 포함되어 있음
	
	// List - 동적배열
	// Collection의 가장 인기있는 하위 인터페이스임
	// ArrayList는 List의 가장 자주 사용하는 구현 클래스
	// List는 자료를 순서대로 저장하는 특성을 가짐
	// FIFO : First In First Out 선입선출
	// 또한, 데이터를 중복으로도 저장가능
	// 단, Set은 중복 불가
	// add 메서드를 통해 데이터를 List의 맨끝에 추가
	
	// 지네릭 generic
	// collection을 배울때 generic을 빼놓으며 불완전하게 collection을 배우는 것임
	// collection을 사용할때 발생할 수 있는 컴파일시간때 엄격한 자료형 검사를 지원
	// 또한, collection을 다룰때 대부분의 downcasting을 제거하고 사용할 수 있음
	// 또한, C++에서 제공하는 클래스 템플릿을 작성할 수 있게 해 줌 (고급)
	
	// 지네릭에서는 매개변수 자료형parameterized type을 이용해서 collection요소의
	// 자료형으로 지정함. 메서드의 매개변수는 ()안에 사용하는 것처럼
	// collection에서는 <>안에 매개변수 자료형 사용
	// List<String> result = null;

	public static void main(String arg[]) {
		
		List a = new ArrayList();
		a.add(111);
		a.add('수');
		a.add(123.456);
		a.add("수지");
		a.add(new J03_MemberVO());
		
		System.out.println(a);
		
		// ArrayList에 저장된 객체를 하나씩 꺼내 출력
		System.out.println(a.get(0));
		System.out.println(a.get(1));
		System.out.println(a.get(2));
		System.out.println(a.get(3));
		System.out.println(a.get(4));
		
		// ArrayList에 저장된 객체를 하나씩 꺼내 변수에 따로 저장
		// 이유 : ArrayList에 객체를 저장할때는 대상이 무엇이든 간에 무조건 Object형으로
		// 저장됨. 따라서, ArrayList에 저장된 객체를 꺼낼때는 객체의 자료형에 맞춰 downcasting 필요 (JKD 5이전)
		int num = (int)a.get(0);
		char chr = (char)a.get(1);
		float fnum = (float)a.get(2);
		String str = (String)a.get(2);
		
		// 하지만 이렇게 해도 일단 컴파일 오류는 발생하지 않는다
		// 실행하면 오류 발생
		// 이런 종류의 오류는 찾기 힘듦
		char nnn = (char)a.get(0);			// int
		Integer intg = (Integer)a.get(2);	// String
		
		// 지네릭을 사용했을 경우
		List<String> abc = new ArrayList<String>();
//		List<String> abc = new ArrayList<>();	// JDK1.7
		// abc라는 콜렉션(동적배열)에는 String 형식의 값만 추가할 수 있다는 의미
		
		//abc.add(123);	// 자료형 검사후 오류 표시
		//abc.add('a');	
		abc.add("tnan");	// 정상처리
		
		String xyz = abc.get(0);	// 형변환 불필요
		
		List<J03_MemberVO> results = new ArrayList<J03_MemberVO>();
		
		
	}

}
